package com.zh.service;

import com.zh.pojo.bo.OrderToDriverBo;
import com.zh.pojo.bo.PayResultBo;
import com.zh.pojo.domain.Order;
import com.baomidou.mybatisplus.extension.service.IService;
import com.zh.pojo.dto.ConfirmAmountDto;
import com.zh.pojo.dto.DriverLocationDto;
import com.zh.pojo.dto.OrderDto;
import com.zh.pojo.vo.*;

import java.util.List;

/**
 * <p>
 * 订单表 服务类
 * </p>
 *
 * @author 初四
 * @since 2024-06-29
 */
public interface IOrderService extends IService<Order> {

    /**
     * 创建订单
     *
     * @param orderDto
     * @return
     */
    String createOrder(OrderDto orderDto);

    /**
     * 司机拉取订单
     *
     * @return
     */
    List<OrderToDriverBo> pullNewOrders();

    /**
     * 司机抢单
     *
     * @param orderNo
     * @return
     */
    KillOrderVo killOrder(String orderNo);

    /**
     *  乘客自动取消订单
     * @param orderNo
     */
    void autoCancelOrder(String orderNo);

    /**
     * 加载司机进行中的订单
     *
     * @return
     */
    Object OrdersInProgressToDriver();

    /**
     * 加载乘客进行中的订单
     * @param
     * @return
     */
    Order selectCustomerInProcessOrder();
    /**
     * 缓存司机坐标、订单号、订单状态
     * @param locationDto
     */
    void cacheLocationPoint(DriverLocationDto locationDto);

    /**
     * 拉取司机坐标位置，订单号，订单状态
     * @param orderNo
     * @return
     */
    DriverLocationDto pullDriverLocation(String orderNo);

    /**
     * 加载订单位置
     * @param orderNo  订单号
     * @return
     */
    OrderLocationVo loadOrderLocatin(String orderNo);

    /**
     *  司机开始代驾
     * @param orderNo
     * @return
     */
    void startDriving(String orderNo);

    /**
     *  司机到达代驾点
     * @param orderNo
     */
    void driverArrive(String orderNo);

    /**
     * 司机结束代驾
     * @param orderNo
     */
    void endDriving(String orderNo);

    /**
     * 司机确认费用
     * @param confirmAmountDto
     */
    void confirm(ConfirmAmountDto confirmAmountDto);

    /**
     * 查询司机订单账单信息
     * @param orderNo
     */
    OrderBillVO selectDriverOrderBill(String orderNo);

    /**
     * 司机发送账单
     * @param orderNo
     */
    void sendPayOrder(String orderNo);

    /**
     * 查询乘客订单账单信息
     * @param orderNo
     * @return
     */
    OrderDetailForCustomerVO selectCustomerOrderBill(String orderNo);

    /**
     * MQ 消费者 确认支付结果  修改订单状态
     * @param payResultBo
     */
    void updateOrderStatus(PayResultBo payResultBo);
}
